package br.com.virtual.base.validator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.inject.Inject;

import br.com.virtual.cadastrar.model.Pessoa;
import br.com.virtual.cadastrar.service.PessoaService;

/**
 * Por utilizar @Inject, deve possuir a annotation @ManagedBean ao inv�s de
 * 
 * @FacesValidator.
 */
@ManagedBean(name = "emailValidator")
@RequestScoped
public class EmailValidator implements Validator {

	 @Inject private PessoaService pessoaService;

	@Override
	public void validate(FacesContext context, UIComponent component,
			Object valorTela) throws ValidatorException {

		if (!validaEmail(valorTela.toString())) {
			throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "",
					"O E-mail digitdo não é válido."));
		}
		
		Pessoa pessoa = this.pessoaService.findByEmail(valorTela.toString());

		// Verifica se o email já existe no banco de dados, se existe, retorna
		// erro
		if (pessoa != null) {
			Long idEditando = (Long) component.getAttributes().get("idPessoa");

			if (!pessoa.getId().equals(idEditando)) {
				throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "",
						"O Email digitado já foi cadastrado por outro usuário."));
			}
		}
		
		
		
		
		
		
	}

	public boolean validaEmail(String email) {

		String nameMask = "[a-zA-Z]+[a-zA-Z0-9]*([\\.|\\-|_][a-zA-Z0-9]+)*";
		String domainMask = "[a-zA-Z]+[a-zA-Z0-9]*([\\.|\\-|_][a-zA-Z0-9]+)+";
		String at = "@";

		String emailMask = nameMask + at + domainMask;

		Pattern padrao = Pattern.compile(emailMask);
		Matcher pesquisa = padrao.matcher(email);

		return pesquisa.matches();
	}

}
